# REQUIRES: arm
# RUN: ld64.lld.darwinold -arch armv7 -r -print_atoms %s -o %t  | FileCheck %s
# RUN: ld64.lld.darwinold -arch armv7 -dylib -print_atoms %t -o %t2 \
# RUN:     %p/Inputs/armv7/libSystem.yaml -sectalign __TEXT __text 0x1000  | FileCheck %s
# RUN: llvm-objdump -d --macho --no-symbolic-operands %t2 | FileCheck --check-prefix=CODE %s
#
# Test thumb and arm branches round trip through -r.
# Test movw/movt pairs have low bit set properly for thumb vs arm.
#
#

--- !mach-o
arch:            armv7
file-type:       MH_OBJECT
flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
sections:
  - segment:         __TEXT
    section:         __text
    type:            S_REGULAR
    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
    alignment:       2
    address:         0x0000000000000000
    content:         [ 0x40, 0xF2, 0x25, 0x00, 0xC0, 0xF2, 0x00, 0x00,
                       0x40, 0xF2, 0x01, 0x01, 0xC0, 0xF2, 0x00, 0x01,
                       0x40, 0xF2, 0x4E, 0x02, 0xC0, 0xF2, 0x00, 0x02,
                       0x40, 0xF2, 0x2A, 0x03, 0xC0, 0xF2, 0x00, 0x03,
                       0x78, 0x44, 0x70, 0x47, 0x70, 0x47, 0x25, 0x00,
                       0x00, 0xE3, 0x00, 0x00, 0x40, 0xE3, 0xD7, 0x1F,
                       0x0F, 0xE3, 0xFF, 0x1F, 0x4F, 0xE3, 0x4E, 0x20,
                       0x00, 0xE3, 0x00, 0x20, 0x40, 0xE3, 0x00, 0x30,
                       0x00, 0xE3, 0x00, 0x30, 0x40, 0xE3, 0x0F, 0x00,
                       0x80, 0xE0, 0x1E, 0xFF, 0x2F, 0xE1, 0x1E, 0xFF,
                       0x2F, 0xE1 ]
    relocations:
      - offset:          0x00000042
        scattered:       true
        type:            ARM_RELOC_HALF_SECTDIFF
        length:          1
        pc-rel:          false
        value:           0x0000004E
      - offset:          0x00000000
        scattered:       true
        type:            ARM_RELOC_PAIR
        length:          1
        pc-rel:          false
        value:           0x00000046
      - offset:          0x0000003E
        scattered:       true
        type:            ARM_RELOC_HALF_SECTDIFF
        length:          0
        pc-rel:          false
        value:           0x0000004E
      - offset:          0x00000000
        scattered:       true
        type:            ARM_RELOC_PAIR
        length:          0
        pc-rel:          false
        value:           0x00000046
      - offset:          0x0000003A
        type:            ARM_RELOC_HALF
        length:          1
        pc-rel:          false
        extern:          false
        symbol:          1
      - offset:          0x0000004E
        type:            ARM_RELOC_PAIR
        length:          1
        pc-rel:          false
        extern:          false
        symbol:          16777215
      - offset:          0x00000036
        type:            ARM_RELOC_HALF
        length:          0
        pc-rel:          false
        extern:          false
        symbol:          1
      - offset:          0x00000000
        type:            ARM_RELOC_PAIR
        length:          0
        pc-rel:          false
        extern:          false
        symbol:          16777215
      - offset:          0x00000032
        scattered:       true
        type:            ARM_RELOC_HALF_SECTDIFF
        length:          1
        pc-rel:          false
        value:           0x00000024
      - offset:          0x0000FFD6
        scattered:       true
        type:            ARM_RELOC_PAIR
        length:          1
        pc-rel:          false
        value:           0x00000046
      - offset:          0x0000002E
        scattered:       true
        type:            ARM_RELOC_HALF_SECTDIFF
        length:          0
        pc-rel:          false
        value:           0x00000024
      - offset:          0x0000FFFF
        scattered:       true
        type:            ARM_RELOC_PAIR
        length:          0
        pc-rel:          false
        value:           0x00000046
      - offset:          0x0000002A
        type:            ARM_RELOC_HALF
        length:          1
        pc-rel:          false
        extern:          false
        symbol:          1
      - offset:          0x00000025
        type:            ARM_RELOC_PAIR
        length:          1
        pc-rel:          false
        extern:          false
        symbol:          16777215
      - offset:          0x00000026
        type:            ARM_RELOC_HALF
        length:          0
        pc-rel:          false
        extern:          false
        symbol:          1
      - offset:          0x00000000
        type:            ARM_RELOC_PAIR
        length:          0
        pc-rel:          false
        extern:          false
        symbol:          16777215
      - offset:          0x0000001C
        scattered:       true
        type:            ARM_RELOC_HALF_SECTDIFF
        length:          3
        pc-rel:          false
        value:           0x0000004E
      - offset:          0x0000002A
        scattered:       true
        type:            ARM_RELOC_PAIR
        length:          3
        pc-rel:          false
        value:           0x00000020
      - offset:          0x00000018
        scattered:       true
        type:            ARM_RELOC_HALF_SECTDIFF
        length:          2
        pc-rel:          false
        value:           0x0000004E
      - offset:          0x00000000
        scattered:       true
        type:            ARM_RELOC_PAIR
        length:          2
        pc-rel:          false
        value:           0x00000020
      - offset:          0x00000014
        type:            ARM_RELOC_HALF
        length:          3
        pc-rel:          false
        extern:          false
        symbol:          1
      - offset:          0x0000004E
        type:            ARM_RELOC_PAIR
        length:          3
        pc-rel:          false
        extern:          false
        symbol:          16777215
      - offset:          0x00000010
        type:            ARM_RELOC_HALF
        length:          2
        pc-rel:          false
        extern:          false
        symbol:          1
      - offset:          0x00000000
        type:            ARM_RELOC_PAIR
        length:          2
        pc-rel:          false
        extern:          false
        symbol:          16777215
      - offset:          0x0000000C
        scattered:       true
        type:            ARM_RELOC_HALF_SECTDIFF
        length:          3
        pc-rel:          false
        value:           0x00000024
      - offset:          0x00000000
        scattered:       true
        type:            ARM_RELOC_PAIR
        length:          3
        pc-rel:          false
        value:           0x00000020
      - offset:          0x00000008
        scattered:       true
        type:            ARM_RELOC_HALF_SECTDIFF
        length:          2
        pc-rel:          false
        value:           0x00000024
      - offset:          0x00000000
        scattered:       true
        type:            ARM_RELOC_PAIR
        length:          2
        pc-rel:          false
        value:           0x00000020
      - offset:          0x00000004
        type:            ARM_RELOC_HALF
        length:          3
        pc-rel:          false
        extern:          false
        symbol:          1
      - offset:          0x00000025
        type:            ARM_RELOC_PAIR
        length:          3
        pc-rel:          false
        extern:          false
        symbol:          16777215
      - offset:          0x00000000
        type:            ARM_RELOC_HALF
        length:          2
        pc-rel:          false
        extern:          false
        symbol:          1
      - offset:          0x00000000
        type:            ARM_RELOC_PAIR
        length:          2
        pc-rel:          false
        extern:          false
        symbol:          16777215
local-symbols:
  - name:            _t1
    type:            N_SECT
    sect:            1
    desc:            [ N_ARM_THUMB_DEF ]
    value:           0x0000000000000000
  - name:            _t2
    type:            N_SECT
    sect:            1
    desc:            [ N_ARM_THUMB_DEF ]
    value:           0x0000000000000024
  - name:            _a2
    type:            N_SECT
    sect:            1
    value:           0x000000000000004E
  - name:            _a1
    type:            N_SECT
    sect:            1
    value:           0x0000000000000026
...

# CHECK: defined-atoms:
# CHECK:   - name:            _t1
# CHECK:     references:
# CHECK:       - kind:            modeThumbCode
# CHECK:         offset:          0
# CHECK:         target:          _t1
# CHECK:       - kind:            thumb_movw
# CHECK:         offset:          0
# CHECK:         target:          _t2
# CHECK-NOT:     addend:
# CHECK:       - kind:            thumb_movt
# CHECK:         offset:          4
# CHECK:         target:          _t2
# CHECK-NOT:     addend:
# CHECK:       - kind:            thumb_movw_funcRel
# CHECK:         offset:          8
# CHECK:         target:          _t2
# CHECK:         addend:          -36
# CHECK:       - kind:            thumb_movt_funcRel
# CHECK:         offset:          12
# CHECK:         target:          _t2
# CHECK:         addend:          -36
# CHECK:       - kind:            thumb_movw
# CHECK:         offset:          16
# CHECK:         target:          _a2
# CHECK-NOT:     addend:
# CHECK:       - kind:            thumb_movt
# CHECK:         offset:          20
# CHECK:         target:          _a2
# CHECK-NOT:     addend:
# CHECK:       - kind:            thumb_movw_funcRel
# CHECK:         offset:          24
# CHECK:         target:          _a2
# CHECK:         addend:          -36
# CHECK:       - kind:            thumb_movt_funcRel
# CHECK:         offset:          28
# CHECK:         target:          _a2
# CHECK:         addend:          -36
# CHECK:   - name:            _t2
# CHECK:     references:
# CHECK:       - kind:            modeThumbCode
# CHECK:         offset:          0
# CHECK:         target:          _t2
# CHECK:   - name:            _a1
# CHECK:     references:
# CHECK:       - kind:            arm_movw
# CHECK:         offset:          0
# CHECK:         target:          _t2
# CHECK-NOT:     addend:
# CHECK:       - kind:            arm_movt
# CHECK:         offset:          4
# CHECK:         target:          _t2
# CHECK-NOT:     addend:
# CHECK:       - kind:            arm_movw_funcRel
# CHECK:         offset:          8
# CHECK:         target:          _t2
# CHECK:         addend:          -40
# CHECK:       - kind:            arm_movt_funcRel
# CHECK:         offset:          12
# CHECK:         target:          _t2
# CHECK:         addend:          -40
# CHECK:       - kind:            arm_movw
# CHECK:         offset:          16
# CHECK:         target:          _a2
# CHECK-NOT:     addend:
# CHECK:       - kind:            arm_movt
# CHECK:         offset:          20
# CHECK:         target:          _a2
# CHECK-NOT:     addend:
# CHECK:       - kind:            arm_movw_funcRel
# CHECK:         offset:          24
# CHECK:         target:          _a2
# CHECK:         addend:          -40
# CHECK:       - kind:            arm_movt_funcRel
# CHECK:         offset:          28
# CHECK:         target:          _a2
# CHECK:         addend:          -40
# CHECK:   - name:            _a2


# CODE: _t1:
# CODE-NEXT:                 	 movw	r0, #4133
# CODE-NEXT:                   movt	r0, #0
# CODE-NEXT:                   movw	r1, #1
# CODE-NEXT:                   movt	r1, #0
# CODE-NEXT:                   movw	r2, #4174
# CODE-NEXT:                   movt	r2, #0
# CODE-NEXT:                   movw	r3, #42
# CODE-NEXT:                   movt	r3, #0


# CODE: _a1:
# CODE-NEXT:                 	 movw	r0, #4133
# CODE-NEXT:                   movt	r0, #0
# CODE-NEXT:                   movw	r1, #65495
# CODE-NEXT:                   movt	r1, #65535
# CODE-NEXT:                   movw	r2, #4174
# CODE-NEXT:                   movt	r2, #0
# CODE-NEXT:                   movw	r3, #0
# CODE-NEXT:                   movt	r3, #0



#	.syntax unified
#	.align	2
#
#	.code	16
#  .thumb_func	_t1
#_t1:
#	movw	r0, :lower16:(_t2)
#	movt	r0, :upper16:(_t2)
#	movw	r1, :lower16:(_t2-(L0+4))
#	movt	r1, :upper16:(_t2-(L0+4))
#	movw	r2, :lower16:(_a2)
#	movt	r2, :upper16:(_a2)
#	movw	r3, :lower16:(_a2-(L0+4))
#	movt	r3, :upper16:(_a2-(L0+4))
#L0:
#	add	r0, pc
#	bx	lr
#
#
#	.code	16
#	.thumb_func	_t2
#_t2:
#	bx	lr
#
#
#
# 	.code	32
#_a1:
#	movw	r0, :lower16:(_t2)
#	movt	r0, :upper16:(_t2)
#	movw	r1, :lower16:(_t2-(L1+8))
#	movt	r1, :upper16:(_t2-(L1+8))
#	movw	r2, :lower16:(_a2)
#	movt	r2, :upper16:(_a2)
#	movw	r3, :lower16:(_a2-(L1+8))
#	movt	r3, :upper16:(_a2-(L1+8))
#L1:
#	add	r0, pc
#	bx	lr
#
#_a2:
#	bx	lr

